<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>对props的简化</title>
</head>

<body>
    <!--准备好一个容器-->
    <div id="test"></div>
    <div id="test1"></div>
    <!--引入核心库-->
    <script src="../js/react.development.js"></script>
    <!--引入react-dom支持react操纵dom-->
    <script src="../js/react-dom.development.js"></script>
    <!--引入babel用于将jsx转为js-->
    <script src="../js/babel.min.js"></script>
    <!--引入prop-types,用于对标签属性进行限制-->
    <script src="../js/prop-types.js">//引入之后全局会产生一个PropType对象</script>


    <script type="text/babel">
        /*class Person extends React.Component {

            //构造器是否接收props 是否传递给super取决于是否希望在构造器中通过this访问props

            //对标签属性进行类型必要性的限制
            static propTypes = {//方法名小写
                //限制字符串必传且为字符串
                name: PropTypes.string.isRequired,
                sex: PropTypes.string,
                age: PropTypes.number,
                //函数的必要性限制关键字为func
                speak: PropTypes.func,
            }
            //默认值设置
            static defaultProps = {
                sex: '垃圾'
            }
            render() {
                //console.log(this);
                //用解构赋值来定义属性
                const { name, age, sex } = this.props
                //props是只读的 如果直接修改会报错
                return (
                    <ul>
                        <li>姓名:{name}</li>
                        <li>性别:{sex}</li>
                        <li>年龄:{age + 1}</li>
                    </ul>
                )//运用解构赋值可以简化代码
            }
        }


        function speak() {
            console.log('说话')
        }*/
        //可以在组件外传递参数

        //函数式组件也可以使用props
        function Person(props) {//因为函数有参数所以可以接收到props

            const { name, age, sex } = props//直接分解接收到的props
            return (
                <ul>
                    <li>姓名:{name}</li>
                    <li>性别:{sex}</li>
                    <li>年龄:{age + 1}</li>
                </ul>
            )

        }

        //如果想对传入的props进行条件及默认值的限制

        //对标签属性进行类型必要性的限制
        Person.propTypes = {//方法名小写
            //限制字符串必传且为字符串
            name: PropTypes.string.isRequired,
            sex: PropTypes.string,
            age: PropTypes.number,
        }
        //默认值设置
        Person.defaultProps = {
            sex: '垃圾'
        }

        ReactDOM.render(<Person name="新元" age={25} />, document.getElementById('test'))

        //批量传递
        //先定义一个需要传递的对象
        //const p = { name: 'xinyaun', age: 22, sex: 'nan' }
        //ReactDOM.render(<Person {...p} />, document.getElementById('test1'))

    </script>
</body>

</html>